package com.third.device.mg.serialport.utils

import java.util.*

/**
 * company 广东玛格家居有限公司
 * @author smoker
 * @Date 2021/12/24
 * Description:扩展函数
 */

/*------------------------------------String-------------------------------------------------------*/
/**
 * 判断字符串是不是Hex(16进制)
 */
fun String.checkHexString(): Boolean {
    for (element in this) {
        val cInt: Int = element.toInt()
        if ((cInt !in 48..57) && (cInt !in 65..70) && (cInt !in 97..102)) {
            return false
        }
    }
    return true
}

/**
 * Hex类型的字符串转成byte[]
 */
fun String.hexToBytes(): ByteArray {
    val s = this.replace(" ", "")
    val bs = ByteArray(s.length / 2)
    for (i in 0 until s.length / 2) {
        bs[i] = s.substring(i * 2, i * 2 + 2).toInt(16).toByte()
    }
    return bs
}

/**
 * 将二进制字符串 "00110011" 转为 byte
 * @return [Byte]
 */
fun String.bitToByte(): Byte {
    val value = Integer.valueOf(this, 2)
    return value.toByte()
}

/*------------------------------------String-------------------------------------------------------*/


/*------------------------------------ByteArray-------------------------------------------------------*/
/**
 * byte[] 转成 Hex的字符串
 */
fun ByteArray.toHexString(hasSpace: Boolean = true) = this.joinToString("") {
    (it.toInt() and 0xFF).toString(16).padStart(2, '0')
        .toUpperCase(Locale.ROOT) + if (hasSpace) " " else ""
}


/**
 * 低位byte[]转Int
 * 小端模式
 * 无符号
 * byte[2] 转成 Int（16bit）
 * 低位byte[]数组转成Int
 */
fun ByteArray.toUInt16L(): Int {
    return ((this[1].toInt() and 0xFF) shl 8) or (this[0].toInt() and 0xFF)
}


/**
 * 高位byte[]转Int
 * 大端模式
 * 无符号
 * byte[2] 转成 Int（16bit）
 * 高位byte[]数组转成Int
 */
fun ByteArray.toUInt16H(): Int {
    return ((this[0].toInt() and 0xFF) shl 8) or (this[1].toInt() and 0xFF)
}


/**
 * 低位byte[]转Int
 * 小端模式
 * 无符号
 * byte[4] 转成 Int（32bit）
 * 低位byte[]数组转成Int
 */
fun ByteArray.toUInt32L(): Long {
    return if (this.size < 4) {
        -1L
    } else {
        (((this[3].toInt() and 0xFF).toLong() shl 24) or
                ((this[2].toInt() and 0xFF).toLong() shl 16) or
                ((this[1].toInt() and 0xFF).toLong() shl 8) or
                (this[0].toInt() and 0xFF).toLong())
    }
}


/**
 * 高位byte[]转Int
 * 大端模式
 * 无符号
 * byte[4] 转成 Int（32bit）
 * 高位byte[]数组转成Int
 */
fun ByteArray.toUInt32H(): Long {
    return if (this.size < 4) {
        -1L
    } else {
        (((this[0].toInt() and 0xFF).toLong() shl 24) or
                ((this[1].toInt() and 0xFF).toLong() shl 16) or
                ((this[2].toInt() and 0xFF).toLong() shl 8) or
                (this[3].toInt() and 0xFF).toLong())
    }
}


/*------------------------------------ByteArray-------------------------------------------------------*/


/*------------------------------------Int-------------------------------------------------------*/
/**
 * 低位byte[]
 * Int 转成 2个字节的byte[]
 * 存储顺序(小端模式)
 * 低位在前 高位在后
 */
fun Int.to2ByteL() = byteArrayOf(
    (this and 0xff).toByte(), (this shr 8).toByte()
)


/**
 * 高位byte[]
 * Int 转成 2个字节的byte[]
 * 存储顺序(大端模式)
 * 高位在前 低位在后
 */
fun Int.to2ByteH() = byteArrayOf(
    (this shr 8).toByte(), (this and 0xff).toByte()
)


/**
 * 低位byte[]
 * Int 转成 4个字节的byte[]
 * 存储顺序(小端模式)
 * 低位在前 高位在后
 */
fun Int.to4ByteL() = byteArrayOf(
    (this and 0xFF).toByte(),
    (this shr 8 and 0xFF).toByte(),
    (this shr 16 and 0xFF).toByte(),
    (this shr 24 and 0xFF).toByte()
)


/**
 * 高位byte[]
 * Int 转成 4个字节的byte[]
 * 存储顺序(大端模式)
 * 高位在前 低位在后
 */
fun Int.to4ByteH() = byteArrayOf(
    (this shr 24 and 0xFF).toByte(),
    (this shr 16 and 0xFF).toByte(),
    (this shr 8 and 0xFF).toByte(),
    (this and 0xFF).toByte()
)

/**
 * 两位数补0
 * 例如：1 ==> 01
 */
fun Int.toZeroString(num :Int = 2) = String.format("%0${num}d", this)
/*------------------------------------Int-------------------------------------------------------*/


/*------------------------------------Byte-------------------------------------------------------*/

fun Byte.toHexString(): String {
    val v = this.toInt() and 0xFF
    val hv = Integer.toHexString(v)
    return if (hv.length < 2) {
        "0${hv}"
    } else {
        hv
    }
}

/**
 * 转成Int后再进行补码
 * 有负数的转成 正数
 */
fun Byte.toIntU(): Int = this.toInt() and 0xFF

/**
 *  将 byte 转为 8位二进制字符串 "00110011"
 *  @param isZero true 8位  false 前面是0的话取消
 *  @return [String] 8位二进制字符串
 */
fun Byte.toBitString(isZero: Boolean = true): String {
    var str = Integer.toBinaryString(this.toInt())
    return if (isZero) {
        var strLen = str.length
        if (strLen < 8) {
            while (strLen < 8) {
                val sb = StringBuffer()
                sb.append("0").append(str) // 左补0
                // sb.append(str).append("0");//右补0
                str = sb.toString()
                strLen = str.length
            }
        }
        str
    } else {
        str
    }

}
/*------------------------------------Byte-------------------------------------------------------*/